package lock;

import java.util.concurrent.TimeUnit;

/**
 * Created by lx on 2017/5/12.
 *
 * Volatile 关键字 : 使变量可见(多线程之间),
 * 具体需要从 JMM (Java Memory Model java内存模型) 分析 (img/JMM-volatitle模型.png)
 *
 * 分析:
 *  程序在执行的过程中有一个主线程空间,它包含所有用到的变量,而其它线程会有自己一个空间
 *  线程1在执行的过程中会把值缓存到该线程空间的CPU缓存中去,假如该CPU一直繁忙它就会一直去改线程的cpu
 *  缓存中去取值,那么线程2对值的改变会放到主空间中去,但是线程1并不能看到。这就是变量不可见
 *
 *  Volatile就是在线程改变变量的时间通知其他的线程去主线程再次获取该值。并不是有些网上说的让其它线程一直从主线程获取值
 *
 */
public class VolatileTest {

    // boolean flag = true; //m() end 是不会输出的
    volatile boolean flag = true;

    void m(){
        System.out.println("m() start");
        while (flag){

        }
        System.out.println("m() end");
    }
    public static void main(String[] args) throws  Exception{

        VolatileTest t = new VolatileTest();

        //jdk 8 新写法
        new Thread(t::m,"t1").start();

        TimeUnit.SECONDS.sleep(3);

        t.flag = false;

    }
}
